//
//  ZXEmptyViewController.h
//  YiShangbao
//
//  Created by simon on 17/3/9.
//  Copyright © 2017年 com.Microants. All rights reserved.
//
// 简介：空数据或请求失败的提示页面，支持[氛围图+title+updateBtn+重请事件];也支持[氛围图+title+解决方案按钮+全屏点击重请事件],重请事件会直接检查网络，无网络会直接提示;点击解决方案按钮会跳转到解决方案提示页面；点击屏幕不会连续触发事件；

//  藕和 MBProgressHUD，Masnary,AFNetworkReachabilityManager第三方；
// 没法兼容全部视图区域，是直接加入到控制器的view上，导致tabViewController，或者隐藏导航条等地方，不能正常显示，只能自己调节设置frame，或者调节contentOffest内容偏移；

// 2018.1.03 新增一些方法，调节属性；
// 2019.6.03 修改注释
// 2019.12.06 优化代码，增加解决方案按钮及事件，点击屏幕事件，增加无网络直接判断；
// 2020.02.06 优化代码，网络跳转修改；
// 2020.04.08 优化代码;
// 2021.06.15 去除宏;
// 2022.04.22 增加判断error不是标准对象的时候的异常崩溃问题；
// 2022.05.05 重构API，重大改变；重构模型数据；
// 2022.05.18 重构API；增加全配置失败图，失败文案；

#import <UIKit/UIKit.h>
#import "EmptyCustomCenterButtonConfig.h"

NS_ASSUME_NONNULL_BEGIN


//是否点击屏幕回调代理方法执行刷新数据
typedef NS_ENUM(NSInteger, ZXEmptyViewTouchEventType)
{
    /// 默认不支持点击空白区域点击回调
    ZXEmptyViewTouchEventTypeNone = 0,
    /// 重新加载
    ZXEmptyViewTouchEventTypeReload = 1,
};

///按钮和touch点击事件类型
typedef NS_ENUM(NSInteger, ZXEmptyViewActionType)
{
    ///touch事件
    ZXEmptyViewActionTypeTouch = 0,
    ///按钮-重新加载,default;
    ZXEmptyViewActionTypeReload = 1,
    ///按钮-解决方案-网络不好造成
    ZXEmptyViewActionTypeErrorSolution = 2,
    ///按钮-自定义
    ZXEmptyViewActionTypeCustomButton = 3,
};


@class ZXEmptyViewController;
@protocol ZXEmptyViewControllerDelegate <NSObject>

@optional
- (void)zxEmptyViewTouchAndActionWithController:(ZXEmptyViewController *)emptyView API_DEPRECATED("-emptyViewController:touchAndActionWithButtonActionType: instead.", ios(2.0, 15.0));;

- (void)emptyViewController:(ZXEmptyViewController *)emptyView touchAndActionWithButtonActionType:(ZXEmptyViewActionType)type;


@end


/*
ZXEmptyViewController的view加入到一个隐藏系统navigationBar的控制器view上时，会覆盖整个控制器view；
调节方式如下：
self.emptyViewController.view.frame = CGRectMake(0, HEIGHT_NAVBAR, LCDW, LCDH-HEIGHT_NAVBAR);
 */

@interface ZXEmptyViewController : UIViewController

@property (nullable, nonatomic, weak) id<ZXEmptyViewControllerDelegate>delegate;

/// 整体内容偏移调节(imageView,textLabel,button一起调节)
@property (nonatomic, assign) CGSize contentOffest;

/// 是否在textLabel展示error的code码
@property (nonatomic, assign) BOOL showErrorCodeOnLabelText;

/// 是否在toast上展示error的code码
@property (nonatomic, assign) BOOL showErrorCodeOnToastText;

/// 是否在加载完成显示空载错误视图的同时显示错误toast;
@property (nonatomic, assign) BOOL showEmptyErrorViewWithErrorToast;

/// 在空数据氛围图的时候（不是错误视图），是否展示按钮；默认NO隐藏,主要用于自定义按钮；
@property (nonatomic, assign) BOOL showEmptyViewCenterButton;

/// 是否点击错误视图空白区域事件回调；默认YES；
@property (nonatomic, assign) BOOL emptyErrorViewTouchEvent;

/// 是否展示重新加载按钮；默认NO，用点击空白区域事件,不用重新加载按钮事件；
@property (nonatomic, assign) BOOL showEmptyErrorViewReloadButton;

/// 自定义按钮的配置设置；
@property (nonatomic, readonly) EmptyCustomCenterButtonConfig *customButtonConfig;

@property (nonatomic, readonly) EmptyTextLabelAppearance *textAppearance;





/// 添加及移除氛围图（数据空氛围图/请求失败氛围图："重新请求"||“查看解决方案”按钮）-弃用
/// @param viewController viewController description
/// @param flag flag description
/// @param error 用于判断是否是请求失败；error == nil,则表示请求成功的空氛围图，也不会有点击屏幕事件；
/// @param image emptyImage description
/// @param title title description
- (void)addEmptyViewInController:(UIViewController *)viewController
                    hasLocalData:(BOOL)flag
                           error:(nullable NSError *)error
                      emptyImage:(nullable UIImage *)image
                      emptyTitle:(nullable NSString *)title API_DEPRECATED("分成2个方法-addEmptyViewInController:和addEmptyErrorViewInController: instead.", ios(2.0, 15.0));



/// 添加及移除空数据氛围图,有本地数据的时候会移除空视图
/// @param viewController viewController description
/// @param flag 是否有本地数据，有本地数据的时候会移除空视图；
/// @param image image description
/// @param title title description
- (void)addEmptyViewInController:(UIViewController *)viewController
                    hasLocalData:(BOOL)flag
                      emptyImage:(nullable UIImage *)image
                      emptyTitle:(nullable NSString *)title;

/// 添加及移除空数据氛围图,有本地数据的时候会移除空视图
/// @param viewController viewController description
/// @param flag 是否有本地数据，有本地数据的时候会移除空视图；
/// @param image image description
/// @param title title description
/// @param hide 自定义设置是否隐藏按钮
- (void)addEmptyViewInController:(UIViewController *)viewController
                    hasLocalData:(BOOL)flag
                      emptyImage:(nullable UIImage *)image
                      emptyTitle:(nullable NSString *)title
                      buttonHide:(BOOL)hide;



/// 添加及移除错误氛围图（请求失败氛围图："重新请求"||“查看解决方案”按钮）
/// @param viewController viewController description
/// @param flag 是否有本地数据
/// @param error error对象
- (void)addEmptyErrorViewInController:(UIViewController *)viewController
                         hasLocalData:(BOOL)flag
                                error:(nullable NSError *)error;


/// 添加及移除错误氛围图（请求失败氛围图："重新请求"||“查看解决方案”按钮）
/// @param viewController viewController description
/// @param flag 是否有本地数据
/// @param error error对象
/// @param image 自定义失败图
/// @param title 自定义失败title
- (void)addEmptyErrorViewInController:(UIViewController *)viewController
                         hasLocalData:(BOOL)flag
                                error:(nullable NSError *)error
                           emptyImage:(nullable UIImage *)image
                           emptyTitle:(nullable NSString *)title;


/// 添加及移除错误氛围图（请求失败氛围图：重新请求按钮）：
/// @param viewController viewController description
/// @param flag flag description
/// @param error error description
- (void)addEmptyErrorViewOnlyUpdateBtnInController:(UIViewController *)viewController
                                      hasLocalData:(BOOL)flag
                                             error:(nullable NSError *)error;


/// 添加及移除错误氛围图（请求失败氛围图：重新请求按钮）
/// @param viewController viewController description
/// @param flag flag description
/// @param error error description
/// @param image 自定义失败图
/// @param title 自定义失败文案
- (void)addEmptyErrorViewOnlyUpdateBtnInController:(UIViewController *)viewController
                                      hasLocalData:(BOOL)flag
                                             error:(nullable NSError *)error
                                        emptyImage:(nullable UIImage *)image
                                        emptyTitle:(nullable NSString *)title;

/// 直接移除氛围图
- (void)removeEmptyViewInContainerViewConroller;



@end

NS_ASSUME_NONNULL_END


